home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* DATABOSS MODULE: DB_DMEM.C */
- /****************************************************************************/
-
- #include "db_lsc.h"
-
- #include <dos.h>
- #include <stddef.h>
- #include "db_types.h"
- #include "db_dos.h"
- #include "db_dmem.h"
-
- /*************************** INTERNAL CONSTANTS ***************************/
-
- #define dosoverhead 1
-
- /***************************** IMPLEMENTATION *****************************/
-
- long dosmavail(void)
- {
- union REGS regs;
-
- regs.h.ah = 0x48;
- regs.x.bx = 0xFFFF;
- intdos(®s,®s);
- return ((regs.h.al == 8) ? ((long) regs.x.bx) << 4 : 0);
- }
-
- ptr dosmalloc(long bytes)
- {
- union REGS regs;
-
- regs.h.ah = 0x48;
- regs.x.bx = (word) ((bytes+15) >> 4);
- intdos(®s,®s);
- return ((regs.x.cflag) ? NULL : MK_FP(regs.x.ax,0));
- }
-
- void dosfree(ptr p)
- {
- union REGS regs;
- struct SREGS sregs;
-
- regs.h.ah = 0x49;
- sregs.es = FP_SEG(p);
- intdosx(®s,®s,&sregs);
- }
-
- ptr dosmallochigh(long bytes)
- {
- long segsrequired;
- long segsavail;
- ptr filler,memptr;
-
- segsrequired = ((bytes+15) >> 4);
- segsavail = dosmavail() >> 4;
- if (segsavail < segsrequired)
- memptr = NULL;
- else {
- if ((segsavail - segsrequired) <= dosoverhead)
- memptr = dosmalloc(segsrequired << 4);
- else {
- filler = dosmalloc((segsavail-(segsrequired+dosoverhead)) << 4);
- memptr = dosmalloc(segsrequired << 4);
- dosfree(filler);
- }
- }
- return (memptr);
- }
-
- /***************************** END OF DB_DMEM.C ***************************/
-